import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class ATM {

    ArrayList<Accton> accs = new ArrayList<>();
    Scanner sc = new Scanner(System.in);
    public void start() {
        while (true) {
            System.out.println("-------欢迎进入ATM系统--------");
            System.out.println("1. 用户登录");
            System.out.println("2. 用户开户");
            System.out.println("0. 退出系统");
            System.out.println("请输入你的操作");
            int choic = sc.nextInt();
            switch(choic) {
                case 1:
                    FindHu();
                    break;
                case 2:
                    Begin();
                    break;
                case 0:
                    System.out.println("欢迎下次光临");
                    return;
                default:
                    System.out.println("输入有误,重新输入");
                    break;
            }
        }


    }

    public void Begin() {
        System.out.println("-------用户开户-------");
        Accton accton = new Accton();
        sc.nextLine();

        System.out.println("请输入你的名字：");
        accton.setName(sc.nextLine());
        while (true) {
            System.out.println("请输入你的性别(男/女)：");
            String i = sc.nextLine();
            if(i.equals("男") || i.equals("女")) {
                accton.setSex(i);
                break;
            } else {
                System.out.println("性别有误，请重新输入你的性别");
            }
        }
        while (true) {
            System.out.println("请输入你的密码：");
            String p = sc.nextLine();
            System.out.println("请再次输入你的密码：");
            String p1 = sc.nextLine();
            if(p.equals(p1)) {
                accton.setMini(p) ;
                break;
            } else{
                System.out.println("两次密码不同，请确认密码");
            }
        }
        System.out.println("请输入你的每次取钱限额");
        accton.setLimt(sc.nextDouble());

        accton.setZhhao(KHao());

        accs.add(accton);
        System.out.println("恭喜" + accton.getName() + IsSex(accton) + "开户成功，你的卡号是：" + accton.getZhhao() );

    }

    public String IsSex(Accton accton) {
        if(accton.getSex().equals("男")) {
            return "先生";

        } else {
            return "女士";
        }
    }

    public String KHao() {
        Random r = new Random();
        while (true) {
            String p = "";
            for (int i = 0; i < 8; i++) {
                int k = r.nextInt(10);
                p += k;
            }
            if(HCHong(p) == null) {
                return p;
            }
        }
    }

    public Accton HCHong(String  p) {
        for (int i = 0; i < accs.size(); i++) {
            Accton acc = accs.get(i);
            if(p.equals(acc.getZhhao())) {
                return acc;
            }
        }
        return null;
    }

    public void login(Accton t) {
            while (true) {
                System.out.println("------用户登录------");
                System.out.println("1. 查询用户");
                System.out.println("2. 存款");
                System.out.println("3. 取款");
                System.out.println("4. 转账");
                System.out.println("5. 修改密码");
                System.out.println("6. 退出");
                System.out.println("7. 注销账户");
                System.out.println("请选择：");
                int p = sc.nextInt();
                switch (p) {
                    case 1:
                        chxun(t);
                        break;
                    case 2:
                        ckuan(t);
                        break;
                    case 3:
                        qkuan(t);
                        break;
                    case 4:
                        zhzhang(t);
                        break;
                    case 5:
                        xgai(t);
                        break;
                    case 6:
                        System.out.println(t.getName() + IsSex(t) + "你退出账户");
                        return;
                    case 7:
                        if (zhxiao(accs, t)) {
                            return;

                        }
                        break;
                    default:
                        System.out.println("输入有误，请重新输入");
                        break;
                }
            }
        }



    public void FindHu() {
        if(accs.size() == 0) {
            System.out.println("没有用户，请先开户");
            return;
        } else {
            while (true) {
                System.out.println("请输入卡号：");
                String p = sc.next();
                Accton pp = HCHong(p);
                if(pp == null) {
                    System.out.println("卡号不存在");
                } else {
                    System.out.println("请输入密码：");
                    while (true) {
                        String l = sc.next();
                        if(l.equals(pp.getMini())) {

                            System.out.println("欢迎" + pp.getName() + IsSex(pp) + "进入系统，你的卡号是：" + pp.getZhhao() );
                            login(pp);
                            return;
                        } else {
                            System.out.println("密码错误，请重新输入：");
                        }
                    }
                }
            }
        }
    }

    public void chxun(Accton p) {
        System.out.println("-------" + p.getName() + IsSex(p) + "账户-------");
        System.out.println("卡号：" + p.getZhhao());
        System.out.println("户主：" + p.getName() + IsSex(p));
        System.out.println("性别：" + p.getSex());
        System.out.println("余额：" + p.getMoney());
        System.out.println("限额：" + p.getLimt());
    }

    public void ckuan(Accton p) {
        System.out.println("------存钱-------");
        System.out.println("请输入存款金额：");
        double m = sc.nextDouble();
        m += p.getMoney();
        p.setMoney(m);
        System.out.println("存款成功");
        chxun(p);
    }

    public void qkuan(Accton p) {
        System.out.println("-----取款------");
        while (true) {

            System.out.println("请输入取款金额 " + "或者输入零退出取款");
            double m = sc.nextDouble();
            if(m == 0) {
                return ;
            }
            if(m > p.getLimt()) {
                System.out.println("取款金额超出限额");
                System.out.println("每次限额" + p.getLimt());


            } else if (m > p.getMoney()){
                System.out.println("余额不足");
                System.out.println("你的余额为：" + p.getMoney());

            } else {
                double k = p.getMoney();
                k -= m;
                p.setMoney(k);
                System.out.println("取款成功");
                chxun(p);
                return;
            }
        }

    }

    public void zhzhang(Accton p) {
        if(accs.size() < 2) {
            System.out.println("当前系统中，不足两个账户,不能进行转账，请去开户吧");
            return;
        } else {
            if(p.getMoney() == 0) {
                System.out.println("自己都没钱了，还转账");
                return;
            } else {
                while (true) {
                    System.out.println("请输入对方的卡号：");
                    String i = sc.next();
                    Accton k = HCHong(i);
                    if(k == null) {
                        System.out.println("你输入的账号不存在");
                    } else {
                        String name1 = "*" + k.getName().substring(1);
                        System.out.println("请输入[" + name1 + "]的姓氏");
                        String name2 = sc.next();
                        if(k.getName().startsWith(name2)) {
                            while (true) {
                                System.out.println("请你输入转账金额：");
                                double l  = sc.nextDouble();
                                if(p.getMoney() < l) {
                                    System.out.println("余额不足，你的余额为：" + p.getMoney());
                                } else {
                                    double n = k.getMoney() + l;
                                    k.setMoney(n);
                                    double m = p.getMoney() - l;
                                    p.setMoney(m);
                                    System.out.println("转账成功");
                                    return;
                                }
                            }


                        } else {
                            System.out.println("你输入的姓氏有误");
                        }
                    }
                }
            }
        }
    }


    public void xgai(Accton p) {
        System.out.println("-----修改密码-----");
        while (true) {
            System.out.println("请你输入当前密码：");
            String i = sc.next();
            if(i.equals(p.getMini())) {
                while (true) {
                    System.out.println("请你输入新密码：");
                    String t = sc.next();
                    System.out.println("请你确认新密码：");
                    String pp = sc.next();
                    if(t.equals(pp)) {
                        p.setMini(pp);
                        System.out.println("恭喜你，修改密码成功");
                        return;
                    } else {
                        System.out.println("确认失败");
                    }
                }
            } else {
                System.out.println("密码错误，重新输入");
            }
        }
    }

    public boolean zhxiao(ArrayList<Accton> accs, Accton p) {
        System.out.println("------注销用户-------");
        while (true) {
            System.out.println("你真的要销户? y/n");
            String k = sc.next();

            if(k.equals("y")) {
                if(p.getMoney() == 0.0) {
                    int l = chzhao(accs, p);
                    accs.remove(l);
                    System.out.println("销户成功");
                    return true;
                } else {
                    System.out.println("你账户中还有钱没有取完，不允许销户");
                    return false;
                }

            } else if (k.equals("n")) {
                System.out.println("好的，当前账户继续保留");
                return false;
            } else {
                System.out.println("请输入 n 或者 y");
            }
        }
    }

    public int chzhao(ArrayList<Accton> accs, Accton p) {
        for (int i = 0; i < accs.size(); i++) {
            Accton k = accs.get(i);
            if(p.getZhhao().equals(k.getZhhao())) {
                return i;
            }
        }
        return -1;
    }
}
